<?php

namespace app\admin\model;

use app\common\model\MoneyLog;
use app\common\model\ScoreLog;
use think\Model;

class User extends Model {

	// 表名
	protected $name = 'user';
	// 自动写入时间戳字段
	protected $autoWriteTimestamp = 'int';
	// 定义时间戳字段名
	protected $createTime = 'createtime';
	protected $updateTime = 'updatetime';
	// 追加属性
	protected $append = [
		'prevtime_text',
		'logintime_text',
		'jointime_text'
	];

	public function getOriginData() {
		return $this->origin;
	}

	protected static function init() {
		self::beforeUpdate( function ( $row ) {
			$changed = $row->getChangedData();
			//如果有修改密码
			if ( isset( $changed['password'] ) ) {
				if ( $changed['password'] ) {
					$salt          = \fast\Random::alnum();
					$row->password = \app\common\library\Auth::instance()->getEncryptPassword( $changed['password'], $salt );
					$row->salt     = $salt;
				} else {
					unset( $row->password );
				}
			}
		} );


		self::beforeUpdate( function ( $row ) {
			$changedata = $row->getChangedData();
			$origin     = $row->getOriginData();
			if ( isset( $changedata['money'] ) && ( function_exists( 'bccomp' ) ? bccomp( $changedata['money'], $origin['money'], 2 ) !== 0 : (double) $changedata['money'] !== (double) $origin['money'] ) ) {
				MoneyLog::create( ['user_id' => $row['id'], 'money' => $changedata['money'] - $origin['money'], 'before' => $origin['money'], 'after' => $changedata['money'], 'memo' => '管理员变更金额'] );
			}
			if ( isset( $changedata['score'] ) && (int) $changedata['score'] !== (int) $origin['score'] ) {
				ScoreLog::create( ['user_id' => $row['id'], 'score' => $changedata['score'] - $origin['score'], 'before' => $origin['score'], 'after' => $changedata['score'], 'memo' => '管理员变更积分'] );
			}
		} );
	}

	public function getGenderList() {
		return ['1' => __( 'Male' ), '0' => __( 'Female' )];
	}

	public function getStatusList() {
		return ['normal' => __( 'Normal' ), 'hidden' => __( 'Hidden' )];
	}

	public function getCreatetimeAttr( $value ) {
		return date( 'Y-m-d H:i:s', $value );
	}

	public function getAvatarAttr( $value ) {
		return !empty($value) ? cdnurl( $value, true ) : request()->domain().'/assets/img/avatar.png';
	}

	public function getFansNum( $userId ) {
		//今日一级粉丝数量
		$one_today_num = $this->where( 'inviter_id', $userId )->whereTime( 'createtime', 'today' )->count();
		//今日二级粉丝数量
		$ids           = $this->where( 'inviter_id', $userId )->column( 'id' );
        $ids_where['inviter_id'] = $ids ? ['in', $ids] : -1;
		$two_today_num = $this->where( $ids_where )->whereTime( 'createtime', 'today' )->count();
		//今日：1+2级
		$today_total = $one_today_num + $two_today_num;

		//非今日一级粉丝数量
		$not_today_num = $this->where( 'inviter_id', $userId )->count();
		//非今日二级粉丝数量
		$idss              = $this->where( 'inviter_id', $userId )->column( 'id' );
        $idss_where['inviter_id'] = $idss ? ['in', $idss] : -1;
		$two_not_today_num = $this->where( $idss_where )->count();
		//历史：1+2级
		$not_today_total = $not_today_num + $two_not_today_num;

		return ['today_total' => $today_total,'not_today_total'=>$not_today_total];
	}

	public function getPrevtimeTextAttr( $value, $data ) {
		$value = $value ? $value : ( $data['prevtime'] ?? "" );
		return is_numeric( $value ) ? date( "Y-m-d H:i:s", $value ) : $value;
	}

	public function getLogintimeTextAttr( $value, $data ) {
		$value = $value ? $value : ( $data['logintime'] ?? "" );
		return is_numeric( $value ) ? date( "Y-m-d H:i:s", $value ) : $value;
	}

	public function getJointimeTextAttr( $value, $data ) {
		$value = $value ? $value : ( $data['jointime'] ?? "" );
		return is_numeric( $value ) ? date( "Y-m-d H:i:s", $value ) : $value;
	}

	protected function setPrevtimeAttr( $value ) {
		return $value && !is_numeric( $value ) ? strtotime( $value ) : $value;
	}

	protected function setLogintimeAttr( $value ) {
		return $value && !is_numeric( $value ) ? strtotime( $value ) : $value;
	}

	protected function setJointimeAttr( $value ) {
		return $value && !is_numeric( $value ) ? strtotime( $value ) : $value;
	}

	protected function setBirthdayAttr( $value ) {
		return $value ? $value : null;
	}

	public function group() {
		return $this->belongsTo( 'UserGroup', 'group_id', 'id', [], 'LEFT' )->setEagerlyType( 0 );
	}

    public function inviter() {
        return $this->belongsTo( 'app\admin\model\User', 'inviter_id', 'id', [], 'LEFT' )->setEagerlyType( 0 );
    }
}
